1 module default_handlers;
2 import std.file;
3 import std.process;
4 import std.path;
5 
6 bool openDefaultBrowser(string link)
7 {
8 	string command;
9 	version(Windows) command = "explorer";
10 	else version(linux) command = "xdg-open";
11 	else version(OSX) command = "open";
12 	return executeShell(command~" "~link).status == 0;
13 }
14 
15 version(Windows)
16 bool getDefaultSourceEditor(string referenceFile, out string defaultTextEditor)
17 {
18     import core.sys.windows.shellapi;
19     import std.string;
20     char[256] output;
21     void* err = FindExecutableA(toStringz(buildNormalizedPath(referenceFile)), null, output.ptr);
22     if(err <= SE_ERR_ACCESSDENIED)
23         return false;
24     defaultTextEditor = fromStringz(output).idup;
25     return true;
26 }
27 else version(OSX)
28 {
29     import objc.runtime;
30     import objc.meta;
31     alias selector = objc.meta.selector;
32 
33     @ObjectiveC extern(C++) final
34     {
35         class NSWorkspace
36         {
37             @selector("sharedWorkspace")
38             static NSWorkspace sharedWorkspace();
39 
40             @selector("URLForApplicationToOpenURL:")
41             NSURL URLForApplicationToOpenURL(NSURL);
42         }
43     }
44     mixin ObjcLinkModule!(default_handlers);
45     mixin ObjcInitSelectors!(__traits(parent, {}));
46 
47     bool getDefaultSourceEditor(string referenceFile, out string defaultTextEditor)
48     {
49         string base = NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL(
50             NSURL.fileURLWithPath(referenceFile.ns)).path.toString;
51         if(base.length == 0) return false;
52         static bool isExecutable(string name){return name.extension == null;}
53         if(base.extension == ".app")
54         {
55             base~= "/Contents/MacOS/";
56             foreach(DirEntry e; dirEntries(base, SpanMode.shallow))
57             {
58                 if(isExecutable(e.name))
59                 {
60                     defaultTextEditor = e.name;
61                     break;
62                 }
63             }
64         }
65         return true;
66     }
67 }
68 else version(linux)
69 {
70     bool getDefaultSourceEditor(string referenceFile, out string defaultTextEditor)
71     {
72         return false;
73     }
74 }
75